#ifndef DATABASE_H
#define DATABASE_H

#include <string>
#include <vector>
#include <fstream>
#include "record.h"
#include "bplus_tree.h"

class SimpleDatabase {
public:
    explicit SimpleDatabase(const std::string& base_filename);
    ~SimpleDatabase();

    // 接口1：初始化和销毁数据库
    void init();

    void destory();

    // 接口2：添加数据
    bool add(const std::vector<Record> &recs);

    // 接口3：删除数据
    bool remove(const std::vector<int> &ids);

    // 接口4：更新名称
    bool update_name(int id, const std::string &new_name);

    // 接口5：点查
    bool find_record_by_id(int id, Record &result);

    // 接口6：范围查询（左闭右开区间）
    std::vector<Record> find_records_in_range(int min_id, int max_id);

    // 接口7：前缀查询
    std::vector<Record> find_records_by_name_prefix(const std::string &prefix);

    // 接口8：清空所有数据
    bool truncate();

private:
    //这里我弃用了filename，因为我有数据文件和索引文件
    //为了让变量名更统一更加望文生义，所以我没用用filename这个变量名
    // std::string filename;

    // 数据文件名
    std::string data_filename;
    // 索引文件名
    std::string index_filename;
    // 数据文件流
    std::fstream data_file;
    // B+树索引
    BPlusTree* bplus_tree;

    //在数据文件中根据id找到对应偏移量对应的位置
    //因为一个记录大小固定，所以直接id*固定大小记录，即可得到在数据文件中的位置
    long long get_data_offset(int id) const {
        return static_cast<long long>(id) * (sizeof(int) + NAME_LEN + DESC_LEN);
    }

    //对字符串进行调整
    //不能超过给定的固定长度，否则就缩容
    //如果不够固定长度，则用空格补齐
    void fix_string(std::string& str, int max_len) const {
        // if (str.size() > max_len){
        //     str.resize(max_len);
        // }else{
        //     // str.append(max_len - str.size(), ' ');
        //     str.resize(max_len);
        // }
        str.resize(max_len);
    }

};

#endif // DATABASE_H